package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Slf4j
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartMapper shoppingCartMapper;

    @Autowired
    private DishMapper dishMapper;

    @Autowired
    private SetmealMapper setmealMapper;


    /**
     * 查看购物车接口
     *
     * @return
     */
    @Override
    public List<ShoppingCart> list() {

        Long userId = BaseContext.getCurrentId();

        ShoppingCart shoppingCart = ShoppingCart.builder()
                .userId(userId)
                .build();


        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);

        return list;
    }

    /**
     * 添加购物车
     *
     * @param shoppingCartDTO
     */
    @Override
    public void add(ShoppingCartDTO shoppingCartDTO) {

        //获取菜品id
        Long dishId = shoppingCartDTO.getDishId();
        //获取口味
        String dishFlavor = shoppingCartDTO.getDishFlavor();
        //获取套餐id
        Long setmealId = shoppingCartDTO.getSetmealId();
        //获取用户id
        Long userId = BaseContext.getCurrentId();

        //new一个购物车类保存数据
        ShoppingCart shoppingCart = ShoppingCart.builder().dishId(dishId).dishFlavor(dishFlavor).setmealId(setmealId).userId(userId).build();

        /*
        业务逻辑：
            1.用户点击菜品或者是套餐即发送一次请求
                a.用户发送一次请求，要么是菜品要么是套餐，不可能两个都有，所以dishId和SetMealId里肯定有一个为NULL
                b.对于菜品来说又有两种情况，如果用户选择的是没有口味数据的菜品，则 dishFlavor 为空，若是有口味数据的菜品，则dishFlavor不为空

            2.每一个用户的购物车要根据用户id区分开
            3.同一个菜品如果口味不同不能算作是同一个菜
            4.如果同一个菜品是第一次添加，则直接添加，如果不是第一次添加，则把数量加一即可
         */

        //根据shoppingCart查询购物车里的数据

        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
        //这个list就是你购物车里的东西，是根据前端发来的dishId或者是SetMealId查出来的
        //如果下面的条件成立，说明这条数据已经存在，菜品或套餐已经插入进入了，直接增加数量就行
        if (list != null && list.size() == 1) {
            shoppingCart = list.get(0); //取出这条数据
            Integer number = shoppingCart.getNumber();
            shoppingCart.setNumber(number + 1); //数量加一

            //把修改后的数据添加进去
            shoppingCartMapper.updateNumberById(shoppingCart);
        } else {
            //到这儿说明该数据是第一次添加，就需要判断添加的是菜品还是套餐
            if (dishId != null) {
                //到这说明用户添加的是菜品不是套餐

                //由于购物车表中并没有提供图片、菜品name、价格，所以需要我们自己查询出来填入shoppingCart类中
                Dish dish = dishMapper.getById(dishId);
                shoppingCart.setImage(dish.getImage());
                shoppingCart.setAmount(dish.getPrice());
                shoppingCart.setName(dish.getName());

            } else {
                //到这说明是套餐
                //由于购物车表中并没有提供图片、套餐name、价格，所以需要我们自己查询出来填入shoppingCart类中
                Setmeal setmeal = setmealMapper.getById(setmealId);

                shoppingCart.setName(setmeal.getName());
                shoppingCart.setImage(setmeal.getImage());
                shoppingCart.setAmount(setmeal.getPrice());

            }

            //判断完成后把shoppingCart填入表中

            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartMapper.add(shoppingCart);

        }

    }

    /**
     * 删除购物车中的一个商品
     *
     * @param shoppingCartDTO
     */
    @Override
    @Transactional
    public void deleteOne(ShoppingCartDTO shoppingCartDTO) {

        /**
         * 1.首先传过来的肯定是菜品或者是套餐
         * 2.菜品又有不同的口味做区分
         * 3.还要判断是哪一个用户的购物车
         */

        //获取菜品id
        Long dishId = shoppingCartDTO.getDishId();
        //获取菜品口味
        String dishFlavor = shoppingCartDTO.getDishFlavor();
        //获取套餐id
        Long setmealId = shoppingCartDTO.getSetmealId();
        //获取用户id
        Long userId = BaseContext.getCurrentId();

        //把数据封装到ShoppingCart实体类中用于删除
        ShoppingCart shoppingCart = ShoppingCart.builder().dishId(dishId).dishFlavor(dishFlavor).setmealId(setmealId).userId(userId).build();

        //然后查询该商品
        //这里不用区分是套餐还是菜品，因为都只涉及到删除和修改数量
        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);

        // 然后查询该商品的数量，如果唯一则直接删除，如果不唯一则数量减一
        if (list != null && list.size() > 0) {
            //到这说明有菜品了
            //由于记录的是同一个菜品查出来的也只有一条数据，不要被list集合误导了，list集合只是为了查询的通用性
            //所以只需要获取集合内的第一条数据即可
            shoppingCart = list.get(0);

            //判断数量
            //首先获取到该条目内所记录的数量
            Integer number = shoppingCart.getNumber();
            if (number == 1) {
                //到这说明只有一条数据，直接删除即可
                shoppingCartMapper.deleteOne(shoppingCart);
            } else {
                //到这说明有两份以上，直接数量减一
                shoppingCart.setNumber(number - 1);
                shoppingCartMapper.updateNumberById(shoppingCart);
            }
        }
    }

    /**
     * 清空购物车
     */
    @Override
    public void clean() {

        //获取用户id，不能清空错了
        Long userId = BaseContext.getCurrentId();

        shoppingCartMapper.cleanByUserId(userId);

    }

}
